widgetpath: Make structure refcounted
authorBenjamin Otte <otte@redhat.com>
Fri, 27 May 2011 14:36:07 +0000 (16:36 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 2 Jun 2011 00:03:51 +0000 (02:03 +0200)
I want to use widget paths in a way that make a lot more sense with a
refcounted structure. See the following patches.

docs/reference/gtk/gtk3-sections.txt
gtk/gtk.symbols
gtk/gtkwidgetpath.c
gtk/gtkwidgetpath.h

index 291b219f78b7c7f63b6a2651950f5863d9df4f7d..45f17734bd1990f5a1b09065b0e51ef7d3be60e5 100644 (file)
@@ -5417,6 +5417,8 @@ GTK_CHECK_VERSION
 GtkWidgetPath
 gtk_widget_path_append_type
 gtk_widget_path_copy
+gtk_widget_path_ref
+gtk_widget_path_unref
 gtk_widget_path_free
 gtk_widget_path_get_object_type
 gtk_widget_path_has_parent
index 51e07da4d6a8cd724503db1cac471f0835555b2f..4948e92d45fe711a4b8fcda868bea48bc83c7bfb 100644 (file)
@@ -3578,6 +3578,8 @@ gtk_widget_override_symbolic_color
 gtk_widget_path
 gtk_widget_path_append_type
 gtk_widget_path_copy
+gtk_widget_path_ref
+gtk_widget_path_unref
 gtk_widget_path_free
 gtk_widget_path_get_type
 gtk_widget_path_get_object_type
index 384cd5f82b9bc2c41dccbc77e300bc43b7ad60fb..52ca7e05701d3347979c25a9f23cbc36062901ac 100644 (file)
@@ -97,6 +97,8 @@ struct GtkPathElement
 
 struct _GtkWidgetPath
 {
+  volatile guint ref_count;
+
   GArray *elems; /* First element contains the described widget */
 };
 
@@ -116,6 +118,7 @@ gtk_widget_path_new (void)
 
   path = g_slice_new0 (GtkWidgetPath);
   path->elems = g_array_new (FALSE, TRUE, sizeof (GtkPathElement));
+  path->ref_count = 1;
 
   return path;
 }
@@ -174,20 +177,44 @@ gtk_widget_path_copy (const GtkWidgetPath *path)
 }
 
 /**
- * gtk_widget_path_free:
+ * gtk_widget_path_ref:
  * @path: a #GtkWidgetPath
  *
- * Frees a #GtkWidgetPath.
+ * Increments the reference count on @path.
  *
- * Since: 3.0
+ * Returns: @path itself.
+ *
+ * Since: 3.2
+ **/
+GtkWidgetPath *
+gtk_widget_path_ref (GtkWidgetPath *path)
+{
+  g_return_val_if_fail (path != NULL, path);
+
+  g_atomic_int_add (&path->ref_count, 1);
+
+  return path;
+}
+
+/**
+ * gtk_widget_path_unref:
+ * @path: a #GtkWidgetPath
+ *
+ * Decrements the reference count on @path, freeing the structure
+ * if the reference count reaches 0.
+ *
+ * Since: 3.2
  **/
 void
-gtk_widget_path_free (GtkWidgetPath *path)
+gtk_widget_path_unref (GtkWidgetPath *path)
 {
   guint i;
 
   g_return_if_fail (path != NULL);
 
+  if (!g_atomic_int_dec_and_test (&path->ref_count))
+    return;
+
   for (i = 0; i < path->elems->len; i++)
     {
       GtkPathElement *elem;
@@ -205,6 +232,23 @@ gtk_widget_path_free (GtkWidgetPath *path)
   g_slice_free (GtkWidgetPath, path);
 }
 
+/**
+ * gtk_widget_path_free:
+ * @path: a #GtkWidgetPath
+ *
+ * Decrements the reference count on @path, freeing the structure
+ * if the reference count reaches 0.
+ *
+ * Since: 3.0
+ **/
+void
+gtk_widget_path_free (GtkWidgetPath *path)
+{
+  g_return_if_fail (path != NULL);
+
+  gtk_widget_path_unref (path);
+}
+
 /**
  * gtk_widget_path_length:
  * @path: a #GtkWidgetPath
index e44824fc523ddd2766de6544979e8d03216a0062..12822a8c0d755c46781e688c4161c75c5b7b6fae 100644 (file)
@@ -41,6 +41,8 @@ GType           gtk_widget_path_get_type            (void) G_GNUC_CONST;
 GtkWidgetPath * gtk_widget_path_new                 (void);
 
 GtkWidgetPath * gtk_widget_path_copy                (const GtkWidgetPath *path);
+GtkWidgetPath * gtk_widget_path_ref                 (GtkWidgetPath       *path);
+void            gtk_widget_path_unref               (GtkWidgetPath       *path);
 void            gtk_widget_path_free                (GtkWidgetPath       *path);
 
 char *          gtk_widget_path_to_string           (const GtkWidgetPath *path);